package org.siqisource.webstart.core.widgets.tree.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;
import org.siqisource.webstart.core.utils.condition.Condition;
import org.siqisource.webstart.core.widgets.tree.config.TreeConfig;
import org.siqisource.webstart.core.widgets.tree.model.TreeNode;
import org.springframework.stereotype.Repository;

@Repository
public interface TreeMapper {
	
	/**
	 * 读取节点
	 */
	public TreeNode readNode(@Param("treeConfig") TreeConfig treeConfig, @Param("id") Integer id);
	
	/**
	 * 读取前一个兄弟节点
	 */
	public TreeNode readNodeBefore(@Param("treeConfig") TreeConfig treeConfig, @Param("treeNode") TreeNode treeNode);
	
	/**
	 * 读取后一个兄弟节点
	 */
	public TreeNode readNodeAfter(@Param("treeConfig") TreeConfig treeConfig, @Param("treeNode") TreeNode treeNode);


	/**
	 * 读取第一个儿子节点
	 */
	public TreeNode readFirstChild(@Param("treeConfig") TreeConfig treeConfig, @Param("id") Integer id);
	
	/**
	 * 读取最后一个儿子节点
	 */
	public TreeNode readLastChild(@Param("treeConfig") TreeConfig treeConfig, @Param("id") Integer id);

	
	/**
	 * 读取sortNo开始前的儿子节点（不含sortNo的那个节点）
	 */
	public List<TreeNode> readChildrenBefore(@Param("treeConfig") TreeConfig treeConfig,
			@Param("parentId") Integer parentId, @Param("sortNo") Integer sortNo);

	/**
	 * 读取sortNo开始后的儿子节点（不含sortNo的那个节点）
	 */
	public List<TreeNode> readChildrenAfter(@Param("treeConfig") TreeConfig treeConfig,
			@Param("parentId") Integer parentId, @Param("sortNo") Integer sortNo);

	/**
	 * 读取树节点所有子孙节点
	 */
	public List<TreeNode> readOffspring(@Param("treeConfig") TreeConfig treeConfig,
			@Param("id") Integer id, @Param("condition") Condition condition);

	/**
	 * 根据条件查询节点
	 */
	public List<TreeNode> readNodes(@Param("treeConfig") TreeConfig treeConfig,
			@Param("condition") Condition condition);

	/**
	 * 查询节点,返回值放在Map中
	 */
	public List<Map<String, Object>> readNodesWithContent(@Param("treeConfig") TreeConfig treeConfig,
			@Param("condition") Condition condition);

	/**
	 * 读取全路径名称
	 */
	public List<TreeNode> readForefather(@Param("treeConfig") TreeConfig treeConfig, @Param("id") Integer id);
	
	/**
	 * 根据父节点下的最大可用序号
	 */
	public int getNextSortNo(@Param("treeConfig") TreeConfig treeConfig, @Param("parentId") int parentId);

	/**
	 * 插入一个节点
	 */
	public void insertNode(@Param("treeConfig") TreeConfig treeConfig, @Param("node") TreeNode treeNode);

	/**
	 * 插入一个带有节点Id的节点
	 */
	public void insertNodeWithNodeId(@Param("treeConfig") TreeConfig treeConfig, @Param("node") TreeNode treeNode);

	/**
	 * 更新是否叶子节点
	 */
	public void updateIsLeaf(@Param("treeConfig") TreeConfig treeConfig, @Param("id") Integer id,
			@Param("isLeaf") Boolean isLeaf);

	/**
	 * 更新节点序号
	 */
	public void updateSortNo(@Param("treeConfig") TreeConfig treeConfig, @Param("id") Integer id,
			@Param("sortNo") Integer sortNo);

	/**
	 * 更新节点标题
	 */
	public void updateNodeLabel(@Param("treeConfig") TreeConfig treeConfig, @Param("id") Integer id,
			@Param("nodeLabel") String nodeLabel);
	
	/**
	 * 更新父节点
	 */
	public void updateParentNodeId(@Param("treeConfig") TreeConfig treeConfig, @Param("id") Integer id,
			@Param("parentId") Integer parentId);
	
	/**
	 * 更新节点全路径
	 */
	public void updateFullPath(@Param("treeConfig") TreeConfig treeConfig, @Param("id") Integer id,
			@Param("fullPath") String fullPath);
	

	/**
	 * 更新节点
	 */
	public void updateNode(@Param("treeConfig") TreeConfig treeConfig, @Param("node") TreeNode treeNode);

	/**
	 * 更新子孙的全路径
	 */
	public void updateOffspringFullPath(@Param("treeConfig") TreeConfig treeConfig,
			@Param("oldFullPath") String oldFullPath, @Param("newFullPath") String newFullPath);

	/**
	 * 批量更子节点的序号
	 */
	public void updateSortNoBatch(@Param("treeConfig") TreeConfig treeConfig,
			@Param("parentId") Integer parentId, @Param("sortNo") Integer sortNo, @Param("step") Integer step);

	/**
	 * 删除节点
	 */
	public void deleteNode(@Param("treeConfig") TreeConfig treeConfig, @Param("id") Integer id);

	/** 
	 * 删除子孙节点
	 */
	public void deleteNodeCascade(@Param("treeConfig") TreeConfig treeConfig, @Param("id") Integer id);

}
